package com.benshou.bcss.common.lock;

import lombok.NonNull;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;

/**
 * 尝试加锁的方法
 *
 * @author <a href="mailto:liuzhenbang@benshou.com">Liu Zhenbang</a>
 */
public interface TryLocking<T extends Lock> {

    /**
     * 尝试加锁
     *
     * @param lock 锁实例
     * @param timeoutRemains 剩余超时时间
     * @param unit 剩余超时时间的单位
     * @return 是否已获得锁占用
     * @throws InterruptedException 若被外部中断，抛出此异常
     */
    boolean tryLock(@NonNull T lock, long timeoutRemains, @NonNull TimeUnit unit) throws InterruptedException;
}
